import _pikabot
import time


class Bot(_pikabot.Bot):
    def __init__(self) -> None:
        self._uart = _pikabot.UART()
        self._uart.setId(2)
        self._uart.setBaudRate(9600)
        self._uart.enable()

    def send(self, data: bytes) -> None:
        self._uart.writeBytes(data, len(data))

    def move(self, servo_id, position, *time):
        t = 500
        if len(time) == 1:
            t = time[0]
        self.send(self.pack(servo_id, position, t))
    
    def moves(self, id_positions: list, *time_):
        t = 500
        if len(time_) == 1:
            t = time_[0]
        packlist = []
        for i in range(0, len(id_positions), 6):
            sublist = []
            for ii in range(i, i + 6):
                sublist.append(id_positions[ii])
            packlist.append(self.packs(sublist, t))
        for pack in packlist:
            # print('pack:', pack)
            self.send(pack)
        time.sleep_ms(t)

    def stand(self, *mode):
        m = 0
        if len(mode) == 1:
            m = mode[0]
        if m == 0:
            self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 200), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 500)
        if m == 1:
            self.moves([(1, 500), (2, 500), (3, 312), (4, 500), (5, 500), (6, 312), (7, 500), (8, 500), (9, 312), (10, 500), (11, 500), (12, 688), (13, 500), (14, 500), (15, 688), (16, 500), (17, 500), (18, 688)], 500)
        if m == 2:
            self.moves([(1, 500), (2, 688), (3, 575), (4, 500), (5, 688), (6, 575), (7, 500), (8, 688), (9, 575), (10, 500), (11, 312), (12, 425), (13, 500), (14, 312), (15, 425), (16, 500), (17, 312), (18, 425)], 500)
    
    def hello(self):
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 200), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 500)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 238), (9, 488), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 500)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 383), (8, 238), (9, 488), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 528), (8, 238), (9, 488), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 383), (8, 238), (9, 488), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 528), (8, 238), (9, 488), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 383), (8, 238), (9, 488), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 488), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 673), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 367), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 673), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 367), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 673), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 367), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 200), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)

    def forword(self):
        self.moves([(1, 575), (2, 312), (3, 125), (4, 425), (5, 238), (6, 125), (7, 575), (8, 312), (9, 125), (10, 575), (11, 762), (12, 875), (13, 425), (14, 688), (15, 875), (16, 575), (17, 762), (18, 875)], 100)
        self.moves([(1, 575), (2, 312), (3, 125), (4, 425), (5, 312), (6, 125), (7, 575), (8, 312), (9, 125), (10, 575), (11, 688), (12, 875), (13, 425), (14, 688), (15, 875), (16, 575), (17, 688), (18, 875)], 100)
        self.moves([(1, 425), (2, 238), (3, 125), (4, 575), (5, 312), (6, 125), (7, 425), (8, 238), (9, 125), (10, 425), (11, 688), (12, 875), (13, 575), (14, 762), (15, 875), (16, 425), (17, 688), (18, 875)], 100)
        self.moves([(1, 425), (2, 312), (3, 125), (4, 575), (5, 312), (6, 125), (7, 425), (8, 312), (9, 125), (10, 425), (11, 688), (12, 875), (13, 575), (14, 688), (15, 875), (16, 425), (17, 688), (18, 875)], 100)
        self.stand()

    def back(self):
        self.moves([(1, 425), (2, 312), (3, 200), (4, 575), (5, 238), (6, 200), (7, 425), (8, 312), (9, 200), (10, 425), (11, 762), (12, 800), (13, 575), (14, 688), (15, 800), (16, 425), (17, 762), (18, 800)], 100)
        self.moves([(1, 425), (2, 312), (3, 200), (4, 575), (5, 312), (6, 200), (7, 425), (8, 312), (9, 200), (10, 425), (11, 688), (12, 800), (13, 575), (14, 688), (15, 800), (16, 425), (17, 688), (18, 800)], 100)
        self.moves([(1, 575), (2, 238), (3, 200), (4, 425), (5, 312), (6, 200), (7, 575), (8, 238), (9, 200), (10, 575), (11, 688), (12, 800), (13, 425), (14, 762), (15, 800), (16, 575), (17, 688), (18, 800)], 100)
        self.moves([(1, 575), (2, 312), (3, 200), (4, 425), (5, 312), (6, 200), (7, 575), (8, 312), (9, 200), (10, 575), (11, 688), (12, 800), (13, 425), (14, 688), (15, 800), (16, 575), (17, 688), (18, 800)], 100)
        self.stand()

    def left(self):
        self.moves([(1, 500), (2, 312), (3, 200), (4, 762), (5, 238), (6, 200), (7, 500), (8, 312), (9, 200), (10, 762), (11, 762), (12, 800), (13, 500), (14, 688), (15, 800), (16, 762), (17, 762), (18, 800)], 100)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 762), (5, 312), (6, 200), (7, 500), (8, 312), (9, 200), (10, 762), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 762), (17, 688), (18, 800)], 100)
        self.moves([(1, 500), (2, 238), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 238), (9, 200), (10, 500), (11, 688), (12, 800), (13, 500), (14, 762), (15, 800), (16, 500), (17, 688), (18, 800)], 100)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 200), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 100)
        self.stand()

    def right(self):
        self.moves([(1, 500), (2, 312), (3, 200), (4, 238), (5, 238), (6, 200), (7, 500), (8, 312), (9, 200), (10, 238), (11, 762), (12, 800), (13, 500), (14, 688), (15, 800), (16, 238), (17, 762), (18, 800)], 100)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 238), (5, 312), (6, 200), (7, 500), (8, 312), (9, 200), (10, 238), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 238), (17, 688), (18, 800)], 100)
        self.moves([(1, 500), (2, 238), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 238), (9, 200), (10, 500), (11, 688), (12, 800), (13, 500), (14, 762), (15, 800), (16, 500), (17, 688), (18, 800)], 100)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 200), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 100)
        self.stand()

    def dance(self):
        self.moves([(1, 400), (2, 312), (3, 200), (4, 400), (5, 312), (6, 200), (7, 400), (8, 312), (9, 200), (10, 400), (11, 688), (12, 800), (13, 400), (14, 688), (15, 800), (16, 400), (17, 688), (18, 800)], 500)
        self.moves([(1, 600), (2, 312), (3, 200), (4, 600), (5, 312), (6, 200), (7, 600), (8, 312), (9, 200), (10, 600), (11, 688), (12, 800), (13, 600), (14, 688), (15, 800), (16, 600), (17, 688), (18, 800)], 500)
        self.moves([(1, 400), (2, 312), (3, 200), (4, 400), (5, 312), (6, 200), (7, 400), (8, 312), (9, 200), (10, 400), (11, 688), (12, 800), (13, 400), (14, 688), (15, 800), (16, 400), (17, 688), (18, 800)], 500)
        self.moves([(1, 600), (2, 312), (3, 200), (4, 600), (5, 312), (6, 200), (7, 600), (8, 312), (9, 200), (10, 600), (11, 688), (12, 800), (13, 600), (14, 688), (15, 800), (16, 600), (17, 688), (18, 800)], 500)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 200), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 300)

    def attack(self):
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 200), (10, 500), (11, 687), (12, 800), (13, 500), (14, 687), (15, 800), (16, 500), (17, 687), (18, 800)], 500)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 237), (6, 200), (7, 500), (8, 312), (9, 200), (10, 500), (11, 687), (12, 800), (13, 500), (14, 762), (15, 800), (16, 500), (17, 687), (18, 800)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 237), (6, 200), (7, 500), (8, 312), (9, 200), (10, 500), (11, 687), (12, 800), (13, 687), (14, 762), (15, 800), (16, 500), (17, 687), (18, 800)], 400)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 500), (8, 312), (9, 200), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 500), (17, 687), (18, 800)], 500)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 124), (9, 200), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 687), (17, 875), (18, 800)], 400)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 500), (9, 725), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 687), (17, 500), (18, 274)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 124), (9, 200), (10, 500), (11, 687), (12, 875), (13, 687), (14, 500), (15, 725), (16, 687), (17, 875), (18, 875)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 500), (9, 725), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 687), (17, 500), (18, 274)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 124), (9, 142), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 687), (17, 875), (18, 875)], 450)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 124), (9, 125), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 687), (17, 875), (18, 537)], 250)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 124), (9, 500), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 687), (17, 875), (18, 875)], 250)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 124), (9, 124), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 687), (17, 875), (18, 537)], 250)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 124), (9, 500), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 687), (17, 875), (18, 875)], 250)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 124), (9, 142), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 687), (17, 875), (18, 875)], 250)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 124), (9, 312), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 687), (17, 875), (18, 687)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 500), (6, 274), (7, 304), (8, 124), (9, 124), (10, 500), (11, 687), (12, 800), (13, 687), (14, 500), (15, 725), (16, 687), (17, 875), (18, 875)], 300)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 312), (5, 312), (6, 200), (7, 304), (8, 124), (9, 124), (10, 500), (11, 687), (12, 800), (13, 687), (14, 687), (15, 800), (16, 687), (17, 875), (18, 875)], 400)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 237), (6, 200), (7, 500), (8, 312), (9, 200), (10, 500), (11, 687), (12, 800), (13, 500), (14, 762), (15, 800), (16, 500), (17, 687), (18, 800)], 400)
        self.moves([(1, 500), (2, 312), (3, 200), (4, 500), (5, 312), (6, 200), (7, 500), (8, 312), (9, 200), (10, 500), (11, 688), (12, 800), (13, 500), (14, 688), (15, 800), (16, 500), (17, 688), (18, 800)], 500)
